package com.cy.pj.common.pool;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * 创建一个对象池类型,然后将此类型的对象交给spring管理,
 * @compont注解描述的对象可以交给spring处理,表示这个对象是一个一般组件.
 * 系统底层会通过反射技术创建Bean实例,并为Bean起一个名字
 *
 * 反射?Java中的一种高级特性,这组特性会借助一组API,获取运行时类的成员,并进行操作
 * 反射最大优势?不能预知未来,可以驾驭未来.
 * Java中应用反射的起点是什么?获取Class对象(字节码对象)
 *
 */
@Component//此注解描述的对象可以交给spring处理,例如创建bean实例,给bean起一个默认名字等
@Scope("prototype")//prototype为多实例作用域,每次从spring框架请求类的实例都会创建新的,可以不写@lazy,不会存到spring周期中
//@Scope("singleton")注解用bean对象的作用域,不写默认是singleton(单例), 相同名字的bean实例在内存只能有一份
//@Lazy//描述对象类型时表示延迟对象的创建,何时需要何时创建,尤其是一些大对象(占用资源比较多),短时间又不会用到 我们可以采用这样策略.
public class ObjectPool {//默认bean对象名字为类名,然后首字母小写,例如objectPool
public ObjectPool(){
    System.out.println("ObjectPool()");

}

//生命周期方法演示:(并不是每个类中都要写这样的方法-一般在池对象的设计中都会有这样的方法)
@PostConstruct //此注解描述的方法为对象生命周期初始化方法,此方法会在构造方法之后执行
public void init(){
    System.out.println("init()");
}
    @PreDestroy //此注解描述的方法为对象生命周期销毁方法,此方法会在对象销毁之前执行
    public void destroy(){
        System.out.println("destroy()");
    }
}
//此类的配置信息在被夹在到内存时,会将类的配置信息储存到Map<String,BeanDefinition>容器中
//早期创建类的实例:new ObjectPool(),newXxxx()
//spring中为什么会使用反射创建对象,而不是直接new 对象类型的方式

